hsweb的系列学习——hsweb-easy-orm分析 上
对于此orm框架的封装,首先要看的便是:hsweb-easy-orm-core
整体思路:因为是为动态表单设计的orm框架,所以要有为映射包装的PO类和反映到表元素的元数据类MetaData,
以及对这些bean进行操作的各种周边(最多的也就是curd的细节分拆)
一,映射包装的PO类
列的设定
我们的curd操作的基本元素首先是表,而我们操作的铁定就是po类,表中的基本元素首先是列,列包含两个属性,名字和字段类型
那么对于这个orm框架中的体现就是:
1 | package org.hsweb.ezorm.core.param; |
此处单独定义了ColumnType
,暂时未见使用
1 | package org.hsweb.ezorm.core.param; |
SQL的参数设定
对列的一系列的操作其实是操作字段及所涉及的数据,那么我们所要设定的地方有:
通过参考一个sql语句可以知道,操作一个字段往往会涉及到where
后面的条件,以及要处理的字段如in{...}
不处理的字段 not in{...}
具体代码里面的体现就是:
首先对条件类型的设定:
1 | /* |
其次对于条件的设定:
1 | package org.hsweb.ezorm.core.param; |
将各种条件用po来表达出来并进行封装
最后对于SQL参数对象的设定:
1 | package org.hsweb.ezorm.core.param; |
这里通过LinkedList
来将条件都包装到一起 ,通过LinkedHashSet
来包装要处理的字段
由Param
衍生出来的专门对查询(如分页)和更新参数的额外封装:
查询往往会涉及到排序,这里对排序先做下封装:
1 | package org.hsweb.ezorm.core.param; |
QueryParam
: 排序字段同样LinkedList
存储
1 | package org.hsweb.ezorm.core.param; |
UpdateParam
:
1 | package org.hsweb.ezorm.core.param; |
对更新数据map
类型包装的数据做扩展:
1 | package org.hsweb.ezorm.core.param; |
表插入数据的封装
InsertParam
:
1 | package org.hsweb.ezorm.core.param; |
和更新针对map
数据类型衍生一样:
1 | package org.hsweb.ezorm.core.param; |
二,反映到表元素的元数据类MetaData
PO转表元素数据
OptionConverter
:选项映射器
1 | package org.hsweb.ezorm.core; |
PropertyWrapper
:属性包装
1 | package org.hsweb.ezorm.core; |
对PropertyWrapper
的简单实现:
1 | package org.hsweb.ezorm.core; |
ValueConverter
:数据转换
1 | package org.hsweb.ezorm.core; |
由其所衍生的类:
这里只看其中一两个即可:
ClobValueConverter
:
1 | package org.hsweb.ezorm.rdb.meta.converter; |
BooleanValueConverter
:
1 | package org.hsweb.ezorm.rdb.meta.converter; |
对象包装ObjectWrapper
:
1 | /* |
其衍生的类:
触发:Trigger
:
1 | package org.hsweb.ezorm.core; |
定义TableMetaData
1 | package org.hsweb.ezorm.core.meta; |
里面包含有表名字,注释,别名,然后就是表所属数据库的元数据信息,表包含列的元数据信息,以及对象的包装,属性的包装,见上面对象包装,属性的包装,以及通过on()
方法对Trigger
使用
定义DatabaseMetaData
1 | package org.hsweb.ezorm.core.meta; |
个人认为,其实这里表达的就是衔接的意思,ObjectWrapper
和TableMetaData
信息的对应(等以后有新的理解了再来修改的)
ValidatorFactory
1 | package org.hsweb.ezorm.core; |
Validator
其实是对INSERT, UPDATE
操作和相应数据进行下验证
1 | package org.hsweb.ezorm.core; |
定义ColumnMetaData
1 | package org.hsweb.ezorm.core.meta; |
里面包含有表名字,注释,别名,然后就是列所属表的元数据信息,表包含列的元数据信息,以及值的转换,选项的转换,属性的包装,见上面数据转换,属性的包装小节,以及通过clone()
方法返回相应的ColumnMetaData
的实现
TableMetaDataStorage
定义
以上三个MetaData元素定义完之后,通过TableMetaDataStorage
来对表元数据做存储方面的一些操作:
1 | package org.hsweb.ezorm.core.meta.storage; |
因为本就是key-value
形式保存的,那么很自然就衍生成map类型的实现类: 都是一些map方面的操作,就不多说了
1 | package org.hsweb.ezorm.core.meta.storage; |
对上面定义的三个元数据类型接口的抽象实现:
对于DatabaseMetaData
的初步通用实现:
1 | package org.hsweb.ezorm.core.meta; |
对于TableMetaData
的初步通用实现:
properties
triggerBase
都是用map
1 | package org.hsweb.ezorm.core.meta; |
对于ColumnMetaData
的初步通用实现:
1 | package org.hsweb.ezorm.core.meta; |
因篇幅有点长,增删改查的相关操作在下一篇中说